<!doctype html>
<html lang="zh-cn">
  <head>
    <title>With语句和上下文管理器 // JW Blog</title>
    <meta charset="utf-8" />
    <meta name="generator" content="Hugo 0.60.1" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="author" content="John Doe" />
    <meta name="description" content="" />
    <link rel="stylesheet" href="https://duyi111.gitee.io/css/main.min.f90f5edd436ec7b74ad05479a05705770306911f721193e7845948fb07fe1335.css" />

    
    <meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="With语句和上下文管理器"/>
<meta name="twitter:description" content="1.with语句的示例代码 # 以写的方式打开文件 with open(&#39;1.txt&#39;, &#39;w&#39;) as f: # 读取文件内容 f.write(&#39;hello world&#39;)  Python提供了with语句的这种写法，既简单又安全，并且with语句执行完成以后自动调用关闭文件操作，即使出现异常也会自动调用关闭文件操作。  2.上下文管理器  一个类只要实现了__enter__()和__exit__()这两个方法，通过该类创建的对象我们就称之为上下文管理器。 上下文管理器可以使用with语句，with语句之所以这么强大，背后是由上下文管理器做支撑的。 自定义上下文管理器类，模拟文件操作：  定义一个File类，实现__enter__()和__exit__()方法，然后使用with语句来完成操作文件，示例代码： class File(object): # 初始化方法 def __init__(self, file_name, file_model): # 定义变量保存文件名和打开模式 self.file_name = file_name self.file_model = file_model # 上文方法 def __enter__(self): print(&#39;进入上文方法&#39;) # 返回文件资源 self.file = open(self.file_name, self.file_model) return self.file # 下文方法 def __exit__(self, exc_type, exc_val, exc_tb): print(&#39;进入下文方法&#39;) self.file.close() if __name__ == &#39;__main__&#39;: # 使用with管理文件 with File(&#39;1.txt&#39;, &#39;r&#39;) as file: file_data = file."/>

    <meta property="og:title" content="With语句和上下文管理器" />
<meta property="og:description" content="1.with语句的示例代码 # 以写的方式打开文件 with open(&#39;1.txt&#39;, &#39;w&#39;) as f: # 读取文件内容 f.write(&#39;hello world&#39;)  Python提供了with语句的这种写法，既简单又安全，并且with语句执行完成以后自动调用关闭文件操作，即使出现异常也会自动调用关闭文件操作。  2.上下文管理器  一个类只要实现了__enter__()和__exit__()这两个方法，通过该类创建的对象我们就称之为上下文管理器。 上下文管理器可以使用with语句，with语句之所以这么强大，背后是由上下文管理器做支撑的。 自定义上下文管理器类，模拟文件操作：  定义一个File类，实现__enter__()和__exit__()方法，然后使用with语句来完成操作文件，示例代码： class File(object): # 初始化方法 def __init__(self, file_name, file_model): # 定义变量保存文件名和打开模式 self.file_name = file_name self.file_model = file_model # 上文方法 def __enter__(self): print(&#39;进入上文方法&#39;) # 返回文件资源 self.file = open(self.file_name, self.file_model) return self.file # 下文方法 def __exit__(self, exc_type, exc_val, exc_tb): print(&#39;进入下文方法&#39;) self.file.close() if __name__ == &#39;__main__&#39;: # 使用with管理文件 with File(&#39;1.txt&#39;, &#39;r&#39;) as file: file_data = file." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://duyi111.gitee.io/post/with%E8%AF%AD%E5%8F%A5%E5%92%8C%E4%B8%8A%E4%B8%8B%E6%96%87%E7%AE%A1%E7%90%86%E5%99%A8/" />
<meta property="article:published_time" content="2020-02-07T21:07:10+08:00" />
<meta property="article:modified_time" content="2020-02-07T21:07:10+08:00" />


  </head>
  <body>
    <header class="app-header">
      <a href="https://duyi111.gitee.io/"><img class="app-header-avatar" src="/avatar.jpg" alt="John Doe" /></a>
      <h1>JW Blog</h1>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vehicula turpis sit amet elit pretium.</p>
      <div class="app-header-social">
        
      </div>
    </header>
    <main class="app-container">
      
  <article class="post">
    <header class="post-header">
      <h1 class ="post-title">With语句和上下文管理器</h1>
      <div class="post-meta">
        <div>
          <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-calendar">
  <title>calendar</title>
  <rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect><line x1="16" y1="2" x2="16" y2="6"></line><line x1="8" y1="2" x2="8" y2="6"></line><line x1="3" y1="10" x2="21" y2="10"></line>
</svg>
          Feb 7, 2020
        </div>
        <div>
          <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-clock">
  <title>clock</title>
  <circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline>
</svg>
          1 min read
        </div></div>
    </header>
    <div class="post-content">
      <h2 id="1with">1.with语句的示例代码</h2>
<pre><code># 以写的方式打开文件
with open('1.txt', 'w') as f:
    # 读取文件内容
    f.write('hello world')
</code></pre><ul>
<li>Python提供了with语句的这种写法，既简单又安全，并且with语句执行完成以后自动调用关闭文件操作，即使出现异常也会自动调用关闭文件操作。</li>
</ul>
<h2 id="2">2.上下文管理器</h2>
<ul>
<li>一个类只要实现了<code>__enter__()</code>和<code>__exit__()</code>这两个方法，通过该类创建的对象我们就称之为<em><strong>上下文管理器</strong></em>。</li>
<li>上下文管理器可以使用with语句，with语句之所以这么强大，背后是由上下文管理器做支撑的。</li>
<li>自定义上下文管理器类，模拟文件操作：
<ul>
<li>定义一个File类，实现<code>__enter__()</code>和<code>__exit__()</code>方法，然后使用with语句来完成操作文件，示例代码：
<pre><code>class File(object):
    # 初始化方法
    def __init__(self, file_name, file_model):
        # 定义变量保存文件名和打开模式
        self.file_name = file_name
        self.file_model = file_model
        
    # 上文方法
    def __enter__(self):
        print('进入上文方法')
        # 返回文件资源
        self.file = open(self.file_name, self.file_model)
        return self.file
        
    # 下文方法
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('进入下文方法')
        self.file.close()
    
    
if __name__ == '__main__':
    # 使用with管理文件
    with File('1.txt', 'r') as file:
        file_data = file.read()
        print(file_data)
            
            
            
# 运行结果：
进入上文方法
hello world
进入下文方法
</code></pre><ul>
<li><code>__enter__</code>表示上文方法，需要返回一个操作文件对象。</li>
<li><code>__exit__</code>表示下文方法，with语句执行完成会自动执行，即使出现异常也会执行该方法。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="3">3.小结</h2>
<ul>
<li>Python提供了with语句用于简化资源释放的操作，使用with语句操作建立在上下文管理器（实现<code>__enter__</code>和 <code>__exit__</code>）的基础上。</li>
</ul>

    </div>
    <div class="post-footer">
      
    </div>
  </article>

    </main>
  </body>
</html>
